#ifndef VEC3_INL
#define VEC3_INL


#include <math.h>


inline Vec3::Vec3()
{
}

inline Vec3::Vec3( float _x, float _y, float _z )
: x( _x )
, y( _y )
, z( _z )
{
}

inline Vec3::Vec3( const Vec3 &v )
: x( v.x )
, y( v.y )
, z( v.z )
{
}

inline Vec3::Vec3( const float *v )
: x( v[ 0 ] )
, y( v[ 1 ] )
, z( v[ 2 ] )
{
	//TODO add assert( !!v );
}


inline const Vec3& Vec3::operator=( const Vec3 &v )
{
	//TODO add assert( this != &v );
	x = v.x;
	y = v.y;
	z = v.z;

	return *this;
}

inline Vec3::operator float*()
{
	return &x;
}

inline Vec3::operator const float*() const
{
	return &x;
}

inline Vec3 Vec3::operator-() const
{
	return Vec3( -x, -y, -z );
}

inline Vec3 Vec3::operator+( const Vec3 &v ) const
{
	return Vec3( x + v.x, y + v.y, z + v.z );
}

inline Vec3 Vec3::operator-( const Vec3 &v ) const
{
	return Vec3( x - v.x, y - v.y, z - v.z );
}

inline Vec3 Vec3::operator*( float a ) const
{
	return Vec3( x * a, y * a, z * a );
}

inline Vec3 Vec3::operator/( float a ) const
{
	//TODO add assert( a != 0.0f );
	const float b = 1.0f / a;
	return Vec3( x * b, y * b, z * b );
}

inline void Vec3::operator+=( const Vec3 &v )
{
	x += v.x;
	y += v.y;
	z += v.z;
}

inline void Vec3::operator-=( const Vec3 &v )
{
	x -= v.x;
	y -= v.y;
	z -= v.z;
}

inline void Vec3::operator*=( float a )
{
	x *= a;
	y *= a;
	z *= a;
}

inline void Vec3::operator/=( float a )
{
	//TODO add assert( a != 0.0f );
	this->operator *=( 1.0f / a );
}

inline float Vec3::operator*( const Vec3 &v ) const
{
	return x * v.x + y * v.y + z * v.z;
}

inline bool Vec3::operator==( const Vec3 &v ) const
{
	return x == v.x && y == v.y && z == v.z;
}

inline bool Vec3::operator!=( const Vec3 &v ) const
{
	return x != v.x || y != v.y || z != v.z;
}


inline float Vec3::LengthSqr() const
{
	return x * x + y * y + z * z;
}


inline void Vec3::SetZero()
{
	x = y = z = 0.0f;
}


inline bool Vec3::IsZero() const
{
	return x == 0.0f && y == 0.0f && z == 0.0f;
}


inline bool Vec3::IsEqual( const Vec3 &v, float eps ) const
{
	return fabs( x - v.x ) < eps && fabs( y - v.y ) < eps && fabs( z - v.z ) < eps;
}


#endif // VEC3_INL
